package com.csx.framework.netty.sample2;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.socket.SocketChannel;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * <p> what does this class do ? </p>
 * <p> How does it work ?</p>
 * <p> Why does it do this ?</p>
 *
 * @author cuisongxu
 * @date 2023/8/8 周二 19:21
 */
public class MyServerHandler extends ChannelInboundHandlerAdapter {

    /**
     * 当客户端主动连接服务端的连接后，这个通道就是活跃的，也就是客户端与服务器建立了通信通道并且可以传输数据
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {

        // 有客户端连接，添加到channelGroup 通信组中
        ChannelHandler.channelGroup.add(ctx.channel());

        SocketChannel channel = (SocketChannel) ctx.channel();
        System.out.println("链接报告开始");
        System.out.println("链接报告信息：有一客户端链接到本服务端");
        System.out.println("链接报告IP:" + channel.localAddress().getHostString());
        System.out.println("链接报告Port:" + channel.localAddress().getPort());
        System.out.println("链接报告完毕");

        // 通知客户端连接建立成功
        String str = "时间:  " + new Date() + "  与服务器  [" + channel.localAddress().getHostString() + "]  连接建立成功.";
//        ctx.writeAndFlush(str);
    }

    /**
     * 当客户端主动断开服务端连接后，这个通道就是不活跃的。也就是说客户端与服务端关闭了通信通道
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("与客户端" + ctx.channel().remoteAddress() + "断开连接!");
        // 当有客户退出后，从channelGroup中移除
        ChannelHandler.channelGroup.remove(ctx.channel());
    }

    /**
     * 当客户端向服务端发送数据时，就会触发该方法
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "  接收到消息:" + msg);
        // 通知客户端消息发送成功,通过ChannelGroup群发给客户端
        String msgToSend = new Date(']') + "  服务端收到来自 [" + ctx.channel().remoteAddress() + "]  的消息" +  msg + " \r\n";
//        ChannelHandler.channelGroup.writeAndFlush(msgToSend);
    }

    /**
     * 捕获异常,当发生异常的时候，就可以做一些相应的处理,比如打印日志，关闭连接
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
        System.out.println("异常消息: \r\n" + cause.getMessage());
    }
}
